#include "serialworker.h"
SerialWorker *SerialWorker::instance_ = nullptr; // 静态实例化初始化

SerialWorker::SerialWorker(int serial_port,const QString &portName,QObject *parent)
    : QObject(parent),serial(new QSerialPort(this)),portName_1(portName), serial_port(serial_port)
{
    qDebug()<<"数据接收线程count: ";
}



SerialWorker::~SerialWorker()
{
    if (serial->isOpen()) {
        serial->close();
        qDebug()<<"serialWorker类关闭，线程退出";
    }
    emit finished();
}

SerialWorker *SerialWorker::instance(int serial_port, const QString &portName)
{
    if(instance_ == nullptr)
    {
        instance_ = new SerialWorker(serial_port,portName);
    }
    return instance_;
}

void SerialWorker::releaseInstance()
{
    // 释放单例实例
    if (instance_ != nullptr) {
        delete instance_;
        instance_ = nullptr;
    }
}

void SerialWorker::SerialSet(int serial_port,const QString &portName)
{
    this->portName_1 = portName;
    this->serial_port = serial_port;
}

void SerialWorker::serial_init()
{
    qDebug()<<"串口已打开";
    serial->setPortName(portName_1);
    serial->setBaudRate(serial_port);
    serial->setDataBits(QSerialPort::Data8);
    serial->setParity(QSerialPort::NoParity);
    serial->setStopBits(QSerialPort::OneStop);
    serial->setFlowControl(QSerialPort::NoFlowControl);
    if (!serial->open(QIODevice::ReadWrite)) {
        //emit errorOccurred(serial->errorString());  // 发送错误信号
        emit showMessage("串口打开失败：请断开设备(最好也重新打开软件)重连");
        qDebug() << "串口打开失败:" << serial->errorString();  // 打印错误信息
        return;
    }
}

// 子线程发送数据
void SerialWorker::doDataSendWork(const QByteArray data)
{
    send_array.append(data);
    if(send_array.size()>256)
    {
        send_array.pop_front();
    }

}

// 停止串口
void SerialWorker::stop_serial()
{
    if (serial->isOpen()) {
        serial->flush();  // 刷新缓冲区
        serial->waitForBytesWritten();  // 等待所有数据写完
        serial->close();
        qDebug()<<"串口已断开";
        disconnect(serial, &QSerialPort::readyRead, this, &SerialWorker::doDataReciveWork);
        releaseInstance();
        emit finished(); // 关闭本线程
    }

    // // 释放并且删除串口对象
    // delete serial;
    // serial = nullptr;
}


// 子线程接收数据
void SerialWorker::doDataReciveWork()
{
    // 处理完成后，可以通过信号发送处理后的数据
    // 暂时接收所有的串口数据
    // 字节数组保存
    QByteArray buffer;
    QByteArray temp = serial->readAll();
    buffer.append(temp);


    if (buffer.size() >= 24)
    {
       // emit dataReceived(buffer);// 主窗口打印16进制数据与获取的传感器数据
        if (buffer.at(0) == 0x53 && buffer.at(1) == 0x54)
        {
            //qDebug()<<"已经收到第一次回复，准备开始校正";
            if(send_array.size()>0)
            {
                serial->write(send_array.dequeue());
            }

        }
    }
    emit display_data(buffer);
    buffer.clear();

}

void SerialWorker::start()
{
    qDebug()<<"开始开始";
    serial_init();
    connect(serial, &QSerialPort::readyRead, this, &SerialWorker::doDataReciveWork);
}

void SerialWorker::onProcessingComplete(const QByteArray resultFrame)
{

    // 确保所有写入操作完成
    serial->flush();
    serial->waitForBytesWritten();

    // 停止计算线程的使用
    stop_static = true;
    //emit stop_proc(stop_static);

}
